Lift physical address restriction in save/restore code.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 15 Feb 2007 14:28:01 +0000 (14:28 +0000)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Thu, 15 Feb 2007 14:28:01 +0000 (14:28 +0000)
Bump this to 44 bits for x86-32 and 52 bits for x86-64.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
tools/libxc/xc_linux_restore.c
tools/libxc/xc_linux_save.c
tools/libxc/xc_pagetab.c
tools/libxc/xg_private.h

index 10e03971ab0ee6f5546b608d2ae76f39b5a12705..822f3c5ec2f73dc6cb0cc1725630956297832bcc 100644 (file)
@@ -82,7 +82,7 @@ static int uncanonicalize_pagetable(int xc_handle, uint32_t dom,
         if(!(pte & _PAGE_PRESENT))
             continue; 
         
-        pfn = (pte >> PAGE_SHIFT) & 0xffffffff;
+        pfn = (pte >> PAGE_SHIFT) & MFN_MASK_X86;
         
         if(pfn >= max_pfn) {
             /* This "page table page" is probably not one; bail. */
@@ -120,12 +120,12 @@ static int uncanonicalize_pagetable(int xc_handle, uint32_t dom,
         if(!(pte & _PAGE_PRESENT))
             continue;
         
-        pfn = (pte >> PAGE_SHIFT) & 0xffffffff;
+        pfn = (pte >> PAGE_SHIFT) & MFN_MASK_X86;
         
         if(p2m[pfn] == INVALID_P2M_ENTRY)
             p2m[pfn] = p2m_batch[nr_mfns++];
 
-        pte &= 0xffffff0000000fffULL;
+        pte &= ~MADDR_MASK_X86;
         pte |= (uint64_t)p2m[pfn] << PAGE_SHIFT;
 
         if(pt_levels == 2)
index 0d8f0459513c65a52120f96483642aa4827b1c99..8930b9fc3c8b70caf9be54cd6e31a583787a197c 100644 (file)
@@ -495,7 +495,7 @@ static int canonicalize_pagetable(unsigned long type, unsigned long pfn,
         hstart = (hvirt_start >> L2_PAGETABLE_SHIFT_PAE) & 0x1ff;
         he = ((const uint64_t *) spage)[hstart];
 
-        if ( ((he >> PAGE_SHIFT) & 0x0fffffff) == m2p_mfn0 ) {
+        if ( ((he >> PAGE_SHIFT) & MFN_MASK_X86) == m2p_mfn0 ) {
             /* hvirt starts with xen stuff... */
             xen_start = hstart;
         } else if ( hvirt_start != 0xf5800000 ) {
@@ -503,7 +503,7 @@ static int canonicalize_pagetable(unsigned long type, unsigned long pfn,
             hstart = (0xf5800000 >> L2_PAGETABLE_SHIFT_PAE) & 0x1ff;
             he = ((const uint64_t *) spage)[hstart];
 
-            if( ((he >> PAGE_SHIFT) & 0x0fffffff) == m2p_mfn0 )
+            if( ((he >> PAGE_SHIFT) & MFN_MASK_X86) == m2p_mfn0 )
                 xen_start = hstart;
         }
     }
@@ -532,7 +532,7 @@ static int canonicalize_pagetable(unsigned long type, unsigned long pfn,
 
         if (pte & _PAGE_PRESENT) {
 
-            mfn = (pte >> PAGE_SHIFT) & 0xfffffff;
+            mfn = (pte >> PAGE_SHIFT) & MFN_MASK_X86;
             if (!MFN_IS_IN_PSEUDOPHYS_MAP(mfn)) {
                 /* This will happen if the type info is stale which
                    is quite feasible under live migration */
@@ -541,7 +541,7 @@ static int canonicalize_pagetable(unsigned long type, unsigned long pfn,
             } else
                 pfn = mfn_to_pfn(mfn);
 
-            pte &= 0xffffff0000000fffULL;
+            pte &= ~MADDR_MASK_X86;
             pte |= (uint64_t)pfn << PAGE_SHIFT;
         }
 
index 38843fefb9370f20f256d06667dc0d4b522a06a3..85b3d15800865f308446c418f835ceacfbb6363c 100644 (file)
@@ -14,7 +14,7 @@
 #define L1_PAGETABLE_SHIFT             12
 #define L2_PAGETABLE_SHIFT             22
 
-#define L0_PAGETABLE_MASK_PAE  0x0000000ffffff000ULL
+#define L0_PAGETABLE_MASK_PAE  0x00000ffffffff000ULL
 #define L1_PAGETABLE_MASK_PAE  0x1ffULL
 #define L2_PAGETABLE_MASK_PAE  0x1ffULL
 #define L3_PAGETABLE_MASK_PAE  0x3ULL
@@ -33,7 +33,7 @@
 #define L1_PAGETABLE_SHIFT             L1_PAGETABLE_SHIFT_PAE
 #define L2_PAGETABLE_SHIFT             L2_PAGETABLE_SHIFT_PAE
 
-#define L0_PAGETABLE_MASK_PAE  0x000000fffffff000ULL
+#define L0_PAGETABLE_MASK_PAE  0x000ffffffffff000ULL
 #define L1_PAGETABLE_MASK_PAE  0x1ffULL
 #define L2_PAGETABLE_MASK_PAE  0x1ffULL
 #define L3_PAGETABLE_MASK_PAE  0x1ffULL
index 62b26db0ff05ac6b2b54702e46493249ee630149..3cf6fbf22ad04cd3ade12aa2b15978f3209fb24e 100644 (file)
@@ -134,6 +134,13 @@ typedef l4_pgentry_64_t l4_pgentry_t;
 #define PAGE_SHIFT_X86          12
 #define PAGE_SIZE_X86           (1UL << PAGE_SHIFT_X86)
 #define PAGE_MASK_X86           (~(PAGE_SIZE_X86-1))
+#if defined(__i386__)
+#define MADDR_BITS_X86          44
+#elif defined(__x86_64__)
+#define MADDR_BITS_X86          52
+#endif
+#define MFN_MASK_X86            ((1ULL << (MADDR_BITS_X86 - PAGE_SHIFT_X86)) - 1)
+#define MADDR_MASK_X86          (MFN_MASK_X86 << PAGE_SHIFT_X86)
 
 #define PAGE_SHIFT_IA64         14
 #define PAGE_SIZE_IA64          (1UL << PAGE_SHIFT_IA64)